package com.lingjtx.im.core.protocol;

import com.google.protobuf.InvalidProtocolBufferException;
import com.lingjtx.common.core.constant.Const;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 解码器（将二进制转为 ProtocolWrapper）
 */
public class ProtocolDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws InvalidProtocolBufferException {
        // 1. 检查可读字节是否足够读取协议头（4 + 1 + 1 + 4 = 10字节）
        if (in.readableBytes() < 10) {
            return;
        }

        // 2. 标记当前读取位置（用于回溯）
        in.markReaderIndex();

        // 3. 读取协议头
        int magic = in.readInt();
        if (magic != Const.IMMsgType.MAGIC) {
            ctx.close(); // 魔数不匹配，关闭连接
            return;
        }

        byte msgType = in.readByte();
        int bodyLength = in.readInt();

        // 4. 检查消息体是否完整
        if (in.readableBytes() < bodyLength) {
            in.resetReaderIndex(); // 重置到标记位置，等待后续数据
            return;
        }

        // 5. 读取消息体（Protobuf 数据）
        byte[] bodyBytes = new byte[bodyLength];
        in.readBytes(bodyBytes);

        // 6. 构造 ProtocolWrapper 对象（暂不解析具体消息类型）
        MessageProto.IMMessage message = MessageProto.IMMessage.parseFrom(bodyBytes);
        out.add(new ProtocolWrapper(msgType, message)); // 添加到解码结果列表
    }

}
